package k8s

import (
	"goproject/logger"
	"sort"
	"time"
)

// TODO 其它 DNS 解析结果

const DnsNoError = "NOERROR"
const DnsNxDomain = "NXDOMAIN"
const DnsServFail = "SERVFAIL"

// DnsLog 域名解析日志原始记录
type DnsLog struct {
	// 日志时间戳
	Time time.Time
	// 解析请求来源IP
	FromIP string
	// 解析域名
	Domain string
	// 解析结果
	Result string
}

type DnsLogSlice []DnsLog

func (dls DnsLogSlice) Len() int           { return len(dls) }
func (dls DnsLogSlice) Swap(i, j int)      { dls[i], dls[j] = dls[j], dls[i] }
func (dls DnsLogSlice) Less(i, j int) bool { return dls[i].Time.Before(dls[j].Time) }

var _ sort.Interface = DnsLogSlice{}

// DnsAim 域名解析目标
type DnsAim struct {
	// 第一个对应日志时间
	StartTime time.Time
	// 最后一个对应日志时间
	EndTime time.Time
	// 解析的域名
	Name string
	// 解析结果
	IsSuccess bool
	// 是不是 k8s 服务
	IsK8sService bool
}

// DnsAimNameSlice 按名字排序
type DnsAimNameSlice []DnsAim

var _ sort.Interface = DnsAimNameSlice{}

func (dans DnsAimNameSlice) Len() int           { return len(dans) }
func (dans DnsAimNameSlice) Swap(i, j int)      { dans[i], dans[j] = dans[j], dans[i] }
func (dans DnsAimNameSlice) Less(i, j int) bool { return dans[i].Name < dans[j].Name }

// DnsAimEndTimeSlice 按截止时间排序
type DnsAimEndTimeSlice []DnsAim

var _ sort.Interface = DnsAimEndTimeSlice{}

func (daets DnsAimEndTimeSlice) Len() int           { return len(daets) }
func (daets DnsAimEndTimeSlice) Swap(i, j int)      { daets[i], daets[j] = daets[j], daets[i] }
func (daets DnsAimEndTimeSlice) Less(i, j int) bool { return daets[i].EndTime.Before(daets[j].EndTime) }

func mergeDnsAim(a, b DnsAim) (result DnsAim) {
	log := logger.GetLogger()

	if a.Name != b.Name {
		log.Errorf("mergeDnsAim 名字不同 %v %v", a, b)
		return
	}
	result = a
	if b.StartTime.Before(result.StartTime) {
		result.StartTime = b.StartTime
	}
	if b.EndTime.After(result.EndTime) {
		result.EndTime = b.EndTime
	}
	if b.IsSuccess {
		result.IsSuccess = true
	}
	return
}

// DnsFilter 域名解析筛选器
type DnsFilter struct {
	name string
	// 目标 Pod 选择器
	podLabels map[string]string
	// FIXME 未考虑系统时间不一致
	// 开始时间
	startTime time.Time
	// 请求开始前域名解析请求来源 Pod IP 可能为空
	startIp string
}

func NewDnsFilter(name string, podLabels map[string]string) (dr *DnsFilter) {
	return &DnsFilter{
		name:      name,
		podLabels: podLabels,
	}
}

// SetStartTimeAndIP 设置域名解析请求开始时间，和域名解析请求来源 Pod IP
func (df *DnsFilter) SetStartTimeAndIP(ip string) {
	df.startTime = time.Now()
	df.startIp = ip
}
